gsk: Add gsk_cairo_node_new()
authorBenjamin Otte <otte@redhat.com>
Sun, 11 Dec 2016 00:23:02 +0000 (01:23 +0100)
committerBenjamin Otte <otte@redhat.com>
Tue, 20 Dec 2016 17:01:09 +0000 (18:01 +0100)
Split off Cairo drawn content nodes and require you to allocate them
using this new function.

docs/reference/gsk/gsk4-sections.txt
gsk/gskcairorenderer.c
gsk/gskglrenderer.c
gsk/gskrendernode.c
gsk/gskrendernode.h
gsk/gskrendernodeprivate.h
gsk/gskvulkanrenderpass.c
gtk/gtksnapshot.c

index 642a52de8a183dd1513f230a9882741bd4dcb375..700377617f1e6b8c658fc672d94d327c67b7e7cd 100644 (file)
@@ -49,13 +49,14 @@ gsk_render_node_set_transform
 gsk_render_node_set_opacity
 gsk_render_node_set_opaque
 gsk_render_node_is_opaque
-gsk_render_node_get_draw_context
 GskBlendMode
 gsk_render_node_set_blend_mode
 GskScalingFilter
 gsk_render_node_set_scaling_filters
 gsk_render_node_set_name
 gsk_texture_node_new
+gsk_cairo_node_new
+gsk_cairo_node_get_draw_context
 <SUBSECTION Standard>
 GSK_IS_RENDER_NODE
 GSK_RENDER_NODE
index 5a31814eecbda8bb5047ea290eb829f41a8eb970..0d3c66e64dd17a9a63140055354749d7e7dff6d5 100644 (file)
@@ -94,8 +94,7 @@ gsk_cairo_renderer_render_node (GskCairoRenderer *self,
       pop_group = TRUE;
     }
 
-  GSK_NOTE (CAIRO, g_print ("Rendering surface %p for node %s[%p] at %g, %g\n",
-                            gsk_render_node_get_surface (node),
+  GSK_NOTE (CAIRO, g_print ("Rendering node %s[%p] at %g, %g\n",
                             node->name,
                             node,
                             frame.origin.x, frame.origin.y));
@@ -110,7 +109,7 @@ gsk_cairo_renderer_render_node (GskCairoRenderer *self,
     }
   else
     {
-      cairo_set_source_surface (cr, gsk_render_node_get_surface (node), frame.origin.x, frame.origin.y); 
+      cairo_set_source_surface (cr, gsk_cairo_node_get_surface (node), frame.origin.x, frame.origin.y); 
       cairo_paint (cr);
     }
 
index b533cbd00e2d73176bfbe7b2bbdc4a9f1fccb375..5eb3d8afe188bbd72398bd7a1ac678b792ebdbed 100644 (file)
@@ -733,7 +733,7 @@ gsk_gl_renderer_add_render_item (GskGLRenderer           *self,
     }
   else if (gsk_render_node_has_surface (node))
     {
-      cairo_surface_t *surface = gsk_render_node_get_surface (node);
+      cairo_surface_t *surface = gsk_cairo_node_get_surface (node);
       int gl_min_filter = GL_NEAREST, gl_mag_filter = GL_NEAREST;
 
       get_gl_scaling_filters (node, &gl_min_filter, &gl_mag_filter);
index c9568c43b9f72824059dd25cd835d1c4bc7e9685..31a6f27eb5b1dc8063ef0b11dc783b66c1e78e07 100644 (file)
@@ -1080,7 +1080,7 @@ gsk_texture_node_new (GskTexture            *texture,
 }
 
 /*< private >
- * gsk_render_node_get_surface:
+ * gsk_cairo_node_get_surface:
  * @node: a #GskRenderNode
  *
  * Retrieves the surface set using gsk_render_node_set_surface().
@@ -1088,9 +1088,10 @@ gsk_texture_node_new (GskTexture            *texture,
  * Returns: (transfer none) (nullable): a Cairo surface
  */
 cairo_surface_t *
-gsk_render_node_get_surface (GskRenderNode *node)
+gsk_cairo_node_get_surface (GskRenderNode *node)
 {
   g_return_val_if_fail (GSK_IS_RENDER_NODE (node), NULL);
+  g_return_val_if_fail (node->type == GSK_CAIRO_NODE, NULL);
 
   return node->surface;
 }
@@ -1218,8 +1219,34 @@ gsk_render_node_get_blend_mode (GskRenderNode *node)
 }
 
 /**
- * gsk_render_node_get_draw_context:
- * @node: a #GskRenderNode
+ * gsk_cairo_node_new:
+ * @bounds: the rectangle to render the to
+ *
+ * Creates a #GskRenderNode that will render a cairo surface
+ * into the area given by @bounds. You can draw to the cairo
+ * surface using gsk_cairo_node_get_draw_context()
+ *
+ * Returns: A new #GskRenderNode
+ *
+ * Since: 3.90
+ */
+GskRenderNode *
+gsk_cairo_node_new (const graphene_rect_t *bounds)
+{
+  GskRenderNode *node;
+
+  g_return_val_if_fail (bounds != NULL, NULL);
+
+  node = gsk_render_node_new (GSK_CAIRO_NODE);
+
+  graphene_rect_init_from_rect (&node->bounds, bounds);
+
+  return node;
+}
+
+/**
+ * gsk_cairo_node_get_draw_context:
+ * @node: a cairo #GskRenderNode
  * @renderer: (nullable): Renderer to optimize for or %NULL for any
  *
  * Creates a Cairo context for drawing using the surface associated
@@ -1233,13 +1260,14 @@ gsk_render_node_get_blend_mode (GskRenderNode *node)
  * Since: 3.90
  */
 cairo_t *
-gsk_render_node_get_draw_context (GskRenderNode *node,
-                                  GskRenderer   *renderer)
+gsk_cairo_node_get_draw_context (GskRenderNode *node,
+                                 GskRenderer   *renderer)
 {
   int width, height;
   cairo_t *res;
 
   g_return_val_if_fail (GSK_IS_RENDER_NODE (node), NULL);
+  g_return_val_if_fail (node->type == GSK_CAIRO_NODE, NULL);
   g_return_val_if_fail (node->is_mutable, NULL);
   g_return_val_if_fail (renderer == NULL || GSK_IS_RENDERER (renderer), NULL);
 
index c724ad298c5a81e835491ebf27629dabb40b78dd..e912fbed98367ea3b2f83b83018a9bd0cda6792f 100644 (file)
@@ -48,6 +48,12 @@ GDK_AVAILABLE_IN_3_90
 GskRenderNode *         gsk_texture_node_new                    (GskTexture               *texture,
                                                                  const graphene_rect_t    *bounds);
 
+GDK_AVAILABLE_IN_3_90
+GskRenderNode *         gsk_cairo_node_new                      (const graphene_rect_t    *bounds);
+GDK_AVAILABLE_IN_3_90
+cairo_t *               gsk_cairo_node_get_draw_context         (GskRenderNode            *node,
+                                                                 GskRenderer              *renderer);
+
 GDK_AVAILABLE_IN_3_90
 GskRenderNode *         gsk_render_node_get_parent              (GskRenderNode *node);
 GDK_AVAILABLE_IN_3_90
@@ -107,9 +113,6 @@ void                    gsk_render_node_set_opaque              (GskRenderNode *
                                                                  gboolean       opaque);
 GDK_AVAILABLE_IN_3_90
 gboolean                gsk_render_node_is_opaque               (GskRenderNode *node);
-GDK_AVAILABLE_IN_3_90
-cairo_t *               gsk_render_node_get_draw_context        (GskRenderNode *node,
-                                                                 GskRenderer   *renderer);
 
 GDK_AVAILABLE_IN_3_90
 void                    gsk_render_node_set_blend_mode          (GskRenderNode *node,
index c70ef62476ed1d7befcc9f374c466be5c6cf5c96..d581af61888228b2215c39a2d623728b65e99e78 100644 (file)
@@ -69,7 +69,7 @@ void gsk_render_node_get_transform (GskRenderNode     *node,
                                     graphene_matrix_t *mv);
 double gsk_render_node_get_opacity (GskRenderNode *node);
 
-cairo_surface_t *gsk_render_node_get_surface (GskRenderNode *node);
+cairo_surface_t *gsk_cairo_node_get_surface (GskRenderNode *node);
 
 GskTexture *gsk_texture_node_get_texture (GskRenderNode *node);
 
index e5c64ccc956c2b5b7c926b691c2b43a8a6ab3d4c..d4c1862c07cb6c08899adc033e053a88e14800d1 100644 (file)
@@ -154,7 +154,7 @@ gsk_vulkan_render_pass_upload (GskVulkanRenderPass *self,
 
         case GSK_VULKAN_OP_SURFACE:
           {
-            cairo_surface_t *surface = gsk_render_node_get_surface (op->node);
+            cairo_surface_t *surface = gsk_cairo_node_get_surface (op->node);
             op->source = gsk_vulkan_image_new_from_data (self->vulkan,
                                                          command_buffer,
                                                          cairo_image_surface_get_data (surface),
index b6025a8b7f2e7255e1b89afaecee1385991353a4..3a57d44ca079d86e272da015bdfb31ade8476b6a 100644 (file)
@@ -409,8 +409,7 @@ gtk_snapshot_append_cairo_node (GtkSnapshot           *snapshot,
   g_return_val_if_fail (snapshot != NULL, NULL);
   g_return_val_if_fail (bounds != NULL, NULL);
 
-  node = gsk_renderer_create_render_node (snapshot->renderer);
-  gsk_render_node_set_bounds (node, bounds);
+  node = gsk_cairo_node_new (bounds);
 
   if (name)
     {
@@ -429,7 +428,7 @@ gtk_snapshot_append_cairo_node (GtkSnapshot           *snapshot,
   gtk_snapshot_append_node (snapshot, node);
   gsk_render_node_unref (node);
 
-  return gsk_render_node_get_draw_context (node, snapshot->renderer);
+  return gsk_cairo_node_get_draw_context (node, snapshot->renderer);
 }
 
 static void